﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GeneracionYPrueba.Properties;

namespace GeneracionYPrueba
{
    public partial class GeneracionYPrueba : Form
    {
        public GeneracionYPrueba()
        {
            InitializeComponent();
        }
        #region Variables

        int[] dados = new int[5]; //Valores de los 5 dados
        int[] repeticiones; //Cantidad de repeticiones de cada valor (1-6)
        int valorMax;
        int maxRepeticiones;
        int intento = 0;

        #endregion

        #region Metodos

        //Metodo principal
        public void BuscarGenerala()
        {
            do
            {
                this.GenerarValores();
                this.ContarRepeticiones();
                this.MostrarDatos();
                if( this.EsGenerala() )
                {
                    this.lblGenerala.Visible = true;
                    break;
                }
            } while( intento<=99 );
        }

        //Genero los valores de los 5 dados, cada uno con un numero aleatorio entre 1 y 6
        public void GenerarValores()
        {
            Random ran = new Random(DateTime.Now.Millisecond);
            int aleatorio;
            if( intento == 0 ) //Si es el primer intento
            {
                for( int i=0; i<5; i++ )
                {
                    aleatorio = ran.Next(1, 7);
                    dados[i] = aleatorio;
                }
            }
            else
            {
                for( int i=0; i<5; i++ )
                {
                    if( dados[i]!=valorMax )
                    {
                        aleatorio = ran.Next(1, 7);
                        dados[i] = aleatorio;
                    }
                }
            }
            intento++;
        }

        //Cuento cantidad de repeticiones de cada valor en un tiro
        public void ContarRepeticiones()
        {
            repeticiones = new int[6];
            for( int i=0; i<6; i++ ) repeticiones[i] = 0; //Inicializo contadores de repeticiones
            for( int i=0; i<5; i++ )
            {
                if( dados[i]==1 ) repeticiones[0]++;
                if( dados[i]==2 ) repeticiones[1]++;
                if( dados[i]==3 ) repeticiones[2]++;
                if( dados[i]==4 ) repeticiones[3]++;
                if( dados[i]==5 ) repeticiones[4]++;
                if( dados[i]==6 ) repeticiones[5]++;
            }

            this.GuardarValorMayor();
        }

        //Si todos son distintos, guardo el mayor valor
        //Si hay 2 repeticiones de 2 valores, guardo el mayor valor
        //Si hay 3 y 2 repeticiones de 2 valores, guardo el valor con mas repeticiones

        public void GuardarValorMayor()
        {
            valorMax = 0; //Es el valor mayor descrito en las condiciones de arriba
            maxRepeticiones = repeticiones[0]; //Es la cantidad de repeticiones del valor mayor
            for( int i=0; i<5; i++ )
            {
                if( maxRepeticiones <=repeticiones[i+1] )
                {
                    maxRepeticiones = repeticiones[i+1];
                    valorMax = i+2;
                }
            }            
            Array.Sort(dados); //Ordeno los dados de menor a mayor 
            Array.Reverse(dados); //Ordeno los dados de mayor a menor
            //Ordeno el arreglo de los dados de mayor a menor para que se pueda cumplir la primera de las
            //3 condiciones mencionadas mas arriba            
            //Mayor cantidad de repeticiones igual a 1 implica que todos son distintos
            if( maxRepeticiones==1 ) valorMax = dados[0];
        }

        //Valido si es generala
        public bool EsGenerala()
        {
            for( int i=0; i<6; i++ )
            {
                if( repeticiones[i]==5 ) return true;
            }
            return false;
        }
        #endregion

        #region Form
        //Muestro el valor de cada dado y el numero de intento 
        public void MostrarDatos()
        {
            //Interfaz
            //Dado 1
            switch( dados[0] )
            {
                case 1:
                pbDado1.Image = Resources._1;
                break;
                case 2:
                pbDado1.Image = Resources._2;
                break;
                case 3:
                pbDado1.Image = Resources._3;
                break;
                case 4:
                pbDado1.Image = Resources._4;
                break;
                case 5:
                pbDado1.Image = Resources._5;
                break;
                case 6:
                pbDado1.Image = Resources._6;
                break;
            }

            //Dado 2
            switch( dados[1] )
            {
                case 1:
                pbDado2.Image = Resources._1;
                break;
                case 2:
                pbDado2.Image = Resources._2;
                break;
                case 3:
                pbDado2.Image = Resources._3;
                break;
                case 4:
                pbDado2.Image = Resources._4;
                break;
                case 5:
                pbDado2.Image = Resources._5;
                break;
                case 6:
                pbDado2.Image = Resources._6;
                break;
            }

            //Dado 3
            switch( dados[2] )
            {
                case 1:
                pbDado3.Image = Resources._1;
                break;
                case 2:
                pbDado3.Image = Resources._2;
                break;
                case 3:
                pbDado3.Image = Resources._3;
                break;
                case 4:
                pbDado3.Image = Resources._4;
                break;
                case 5:
                pbDado3.Image = Resources._5;
                break;
                case 6:
                pbDado3.Image = Resources._6;
                break;
            }

            //Dado 4
            switch( dados[3] )
            {
                case 1:
                pbDado4.Image = Resources._1;
                break;
                case 2:
                pbDado4.Image = Resources._2;
                break;
                case 3:
                pbDado4.Image = Resources._3;
                break;
                case 4:
                pbDado4.Image = Resources._4;
                break;
                case 5:
                pbDado4.Image = Resources._5;
                break;
                case 6:
                pbDado4.Image = Resources._6;
                break;
            }

            //Dado 5
            switch( dados[4] )
            {
                case 1:
                pbDado5.Image = Resources._1;
                break;
                case 2:
                pbDado5.Image = Resources._2;
                break;
                case 3:
                pbDado5.Image = Resources._3;
                break;
                case 4:
                pbDado5.Image = Resources._4;
                break;
                case 5:
                pbDado5.Image = Resources._5;
                break;
                case 6:
                pbDado5.Image = Resources._6;
                break;
            }
            txtIntento.Text = intento.ToString();
            for( int i=0; i<5; i++ )
            {
                txtSolucionesAnteriores.AppendText(Convert.ToString(dados[i]));
                txtSolucionesAnteriores.AppendText(" ");
            }
            txtSolucionesAnteriores.AppendText("\n");
        }
        #endregion

        #region Eventos
        private void btnIniciarBusqueda_Click( object sender, EventArgs e )
        {
            this.GenerarValores();
            this.ContarRepeticiones();
            this.MostrarDatos();

            //Interfaz
            this.btnSiguienteIntento.Enabled = true;
            this.btnIniciarBusqueda.Enabled = false;
            this.btnReiniciar.Enabled = true;
        }

        private void btnSiguienteIntento_Click( object sender, EventArgs e )
        {
            this.GenerarValores();
            this.ContarRepeticiones();
            this.MostrarDatos();
            if( this.EsGenerala() )
            {
                this.lblGenerala.Visible = true;
                //Interfaz
                this.txtSolucionesAnteriores.AppendText("Intentos: ");
                this.txtSolucionesAnteriores.AppendText(Convert.ToString(intento));
                this.txtSolucionesAnteriores.AppendText("\n");
                this.txtSolucionesAnteriores.AppendText("------------------");
                this.txtSolucionesAnteriores.AppendText("\n");
                this.btnSiguienteIntento.Enabled = false;
                this.btnBuscarSolucion.Enabled = false;
                this.btnIniciarBusqueda.Enabled = false;
            }
        }

        private void btnBuscarSolucion_Click( object sender, EventArgs e )
        {
            this.BuscarGenerala();
            //Interfaz
            this.txtSolucionesAnteriores.AppendText("Intentos: ");
            this.txtSolucionesAnteriores.AppendText(Convert.ToString(intento));
            this.txtSolucionesAnteriores.AppendText("\n");
            this.txtSolucionesAnteriores.AppendText("------------------");
            this.txtSolucionesAnteriores.AppendText("\n");
            this.btnSiguienteIntento.Enabled = false;
            this.btnBuscarSolucion.Enabled = false;
            this.btnIniciarBusqueda.Enabled = false;
            this.btnReiniciar.Enabled = true;
        }

        private void btnReiniciar_Click( object sender, EventArgs e )
        {
            //Interfaz
            this.txtIntento.Text = intento.ToString();
            this.pbDado1.Image = Resources._1;
            this.pbDado2.Image = Resources._2;
            this.pbDado3.Image = Resources._3;
            this.pbDado4.Image = Resources._4;
            this.pbDado5.Image = Resources._5;
            this.btnSiguienteIntento.Enabled = true;
            this.btnBuscarSolucion.Enabled = true;
            this.btnIniciarBusqueda.Enabled = true;
            this.btnSiguienteIntento.Enabled = false;
            this.btnReiniciar.Enabled = false;
            this.lblGenerala.Visible = false;
            if( !( EsGenerala() ) )
            {
                this.txtSolucionesAnteriores.AppendText("Intentos: ");
                this.txtSolucionesAnteriores.AppendText(Convert.ToString(intento));
                this.txtSolucionesAnteriores.AppendText("\n");
                this.txtSolucionesAnteriores.AppendText("------------------");
                this.txtSolucionesAnteriores.AppendText("\n");
            }

            intento = 0;
        }
        #endregion

        private void GeneracionYPrueba_Load( object sender, EventArgs e )
        {

        }
    }
}
